package com.cookie.rest;

import com.cookie.config.CanalClientConfig;
import com.cookie.config.MysqlConfig;
import com.cookie.config.RedisConfig;
import com.cookie.loader.CanalWorker;
import com.cookie.utils.EtlResult;
import com.cookie.utils.EtlUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.PostConstruct;

@RestController
public class CommonRest {
    // 自动注入redis conf和canal conf
    @Autowired
    RedisConfig redisConf;
    @Autowired
    CanalClientConfig canalConf;
    @Autowired
    MysqlConfig mysqlConf;

    // 这个东西阻止了下面的启动
    // Initializing ExecutorService 'applicationTaskExecutor'
    // Tomcat started on port(s): 8087 (http) with context path ''
    // Started Canal2RedisApplication in 1.448 seconds (JVM running for 1.775)
    @PostConstruct
    public void init(){
        // TODO 这里进行的是全量同步，不需要连接数据库
        // 可以考虑让redis在这里就进行初始化，因为全量和增量同步都要用到它，
        CanalWorker worker = new CanalWorker(canalConf,redisConf,mysqlConf);
        // 这里需要额外开一个线程来执行同步程序，否则会阻塞 spring boot application的启动
        // 也就无法执行rest api
        // worker.start();
        /*
        new Thread(){
            @Override
            public void run(){
                worker.start();
            }
        }.start();*/
        // Thread thread = new Thread(this::etl);
        // lambda表达式
        Thread thread = new Thread(worker::start);
        thread.start();
    }

    // private void etl() {}

    @PostMapping("/etl/test/{some}")
    public void etlTest(@PathVariable String some){
        System.out.println(some);
    }

    /**
     * ETL curl http://127.0.0.1:8081/etl/redis/table_name -X POST
     * 返回一个elt result
     *
     * @param table 要全量同步的表名
     */
    @PostMapping("/etl/redis/{table}")
    public EtlResult etl(@PathVariable String table){
        // TODO 执行etl时会先上锁，如果已经锁上了（正在执行进行全量同步），就直接返回
        // boolean locked = etlLock.tryLock(ETL_LOCK_ZK_NODE + type + "-" + destination);
        // TODO 执行全量同步时，关闭开关，此时增量同步会被阻塞
        // boolean oriSwitchStatus = syncSwitch.status(destination);
        /*
        if (oriSwitchStatus) {
            syncSwitch.off(destination);
        }
        try{
            return adapter.etl(task, paramArray);
        }finally{
            // 执行完成后，打开开关，被阻塞的增量同步会被唤醒
            syncSwitch.on(destination);
            // 执行完全量同步后，解锁
            etlLock.unlock(ETL_LOCK_ZK_NODE + type + "-" + destination);
        }
        */

        // 使用全量同步工具进行同步
        // 在这里再创建一个redis连接池就显得很傻
        EtlUtil etlUtil = new EtlUtil(table, mysqlConf,redisConf);
        etlUtil.etl();
        // 设置响应信息
        EtlResult result = new EtlResult();
        result.setSucceeded(true);
        result.setResultMessage(table);
        return result;
    }

}
